package com.chenziwen.scala.chapter08

import scala.collection.mutable

object Scala08_Map {
  def main(args: Array[String]): Unit = {
    // 创建不可变映射集合Map(声明顺序即是访问顺序)
    // 构建Map集合中，集合中的元素其实是Tuple2类型
    val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
    println("不可变映射:" + map1)

    // 创建可变映射集合(此时集合是无序的)
    val map2 = mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
    println("可变映射:" + map2)

    // 创建空映射
    val map3 = new mutable.HashMap[String, Int]()
    println("空映射:" + map3)

    // 使用元组的方式构建集合
    val map4 = Map(("A", 1), ("B", 2), ("C", 3))
    println(map4)

    // 获取集合中的数据
    println(map4("A"))

    // 如果从Map集合中获取不存在的Key的数据，会发生异常：java.util.NoSuchElementException
    if (map4.contains("AA")) {
      println(map4("AA"))
    }
    // Scala更推荐使用这种方式进行访问:这种方式返回的是一个Option对象，可以有效的避免空指针异常
    // 当有值时，返回的是Some(值对象)，当无值时，返回的是None
    println(map4.get("A").get)
    println(map4.getOrElse("AA", 0))


    // 更新集合中的数据(前提是，该集合是可变集合)
    val map5 = mutable.Map(("A", 1), ("B", 2), ("C", 3))
    map5("A") = 10

    println(map5)

    // 增加元素
    map5 += ("D" -> 4)
    map5 += ("B" -> 20)
    println(map5)

    // 删除元素(可以删除不存在的Key)
    map5 -= ("A", "E")
    println(map5)

    // 循环遍历Map
    for ((k, v) <- map5) {
      println(k + "=" + v)
    }

    for (k <- map5.keys) {
      println(k + "=" + map5(k))
    }

    for (v <- map5.values) {
      println(v)
    }

    // 将Map中的元素作为元组来遍历
    for (t <- map5) {
      println(t._1 + "=" + t._2)
    }

  }
}
